package com.tensquare.service;

import com.tensquare.dao.LabelDao;
import entity.PageResult;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import com.tensquare.pojo.Label;
import org.springframework.transaction.annotation.Transactional;
import util.IdWorker;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;

@Service
@Transactional
public class LabelService {

    @Autowired
    private LabelDao labelDao;
    @Autowired
    private IdWorker idWorker;

    //查询所有的标签列表
    public List<Label> findAll() {
        List<Label> all = labelDao.findAll();
        return all;

    }

    //新增标签
    public void addLabel(Label label) {
        //需要设置id
        label.setId(idWorker.nextId() + "");
        labelDao.save(label);
    }

    //根据id修改标签
    public void updateLabel(Label label) {
        labelDao.save(label);
    }

    //根据id删除标签
    public void deleteLabel(String labelId) {
        labelDao.deleteById(labelId);
    }

    //根据id查询标签
    public Label findByid(String labelId) {
        Label label = labelDao.findById(labelId).get();
        return label;
    }
    //根据条件查询
    public List<Label> searchLabel(Label label) {

        return labelDao.findAll(createSpecification(label));
    }


    //封装查询条件的方法
    public Specification<Label> createSpecification(Label label) {
        return new Specification<Label>() {
            @Override
            public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
                List<Predicate> predicateList = new ArrayList<>();
                if (label != null) {
                    //添加模糊查询标签名称
                    //like返回的是predicate
                    if(StringUtils.isNotBlank(label.getLabelname())){
                        predicateList.add(cb.like(root.get("labelname").as(String.class),"%"+label.getLabelname()+"%"));
                    }
                    //添加状态查询条件
                    if(StringUtils.isNotBlank(label.getState())){
                        predicateList.add(cb.equal(root.get("state").as(String.class),label.getState()));
                    }
                    //添加是否推荐查询条件
                    if(StringUtils.isNotBlank(label.getRecommend())){
                        predicateList.add(cb.equal(root.get("recommend").as(String.class),label.getRecommend()));
                    }
                }
                    //将集合转换为数组
                    Predicate[] predicates = predicateList.toArray(new Predicate[predicateList.size()]);
                //返回查询条件对象
                return cb.and(predicates);
            }
        };
    }

    //根据标签条件查询+分页
    public PageResult<Label> searchPageLabel(Label label, int page, int size) {
        //定义一个查询对象
        PageRequest pageRequest=PageRequest.of(page-1,size);
        //开始查询调用分装查询的方法
        Page<Label> all = labelDao.findAll(createSpecification(label), pageRequest);
        //返回一个分类类对象,里面包含了总的条数和总的数据
        return new PageResult<>(all.getTotalElements(),all.getContent());
    }
}
